const express = require('express');
const { body } = require('express-validator');
const petController = require('../controllers/petController');
const { protect, restrictTo, checkOwnership, optionalAuth } = require('../middleware/auth');
const rateLimit = require('express-rate-limit');

const router = express.Router();

// 限制宠物操作请求的频率
const petLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 100, // 限制每个IP 15分钟内最多100次请求
  message: {
    status: 'error',
    message: '请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 验证规则
const createPetValidation = [
  body('name')
    .isLength({ min: 1, max: 100 })
    .withMessage('宠物名字长度必须在1-100个字符之间')
    .trim(),
  
  body('species')
    .isIn(['dog', 'cat', 'bird', 'fish', 'rabbit', 'hamster', 'guinea_pig', 'reptile', 'other'])
    .withMessage('请选择有效的宠物种类'),
  
  body('breed')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('品种名称长度必须在1-100个字符之间')
    .trim(),
  
  body('gender')
    .isIn(['male', 'female', 'unknown'])
    .withMessage('性别必须是 male、female 或 unknown'),
  
  body('dateOfBirth')
    .optional()
    .isISO8601()
    .withMessage('请提供有效的出生日期'),
  
  body('color')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('颜色描述长度必须在1-100个字符之间')
    .trim(),
  
  body('size')
    .isIn(['small', 'medium', 'large', 'extra_large'])
    .withMessage('大小必须是 small、medium、large 或 extra_large'),
  
  body('weight')
    .optional()
    .isFloat({ min: 0.1, max: 200 })
    .withMessage('体重必须在0.1-200kg之间'),
  
  body('health.spayedNeutered')
    .optional()
    .isBoolean()
    .withMessage('绝育状态必须是布尔值'),
  
  body('health.allergies')
    .optional()
    .isArray()
    .withMessage('过敏信息必须是数组'),
  
  body('behavior.temperament')
    .optional()
    .isArray()
    .withMessage('性情必须是数组'),
  
  body('behavior.goodWithKids')
    .optional()
    .isBoolean()
    .withMessage('与儿童相处状态必须是布尔值'),
  
  body('behavior.goodWithPets')
    .optional()
    .isBoolean()
    .withMessage('与其他宠物相处状态必须是布尔值'),
  
  body('feeding.diet')
    .optional()
    .isLength({ min: 1, max: 200 })
    .withMessage('饮食描述长度必须在1-200个字符之间')
    .trim()
];

const updatePetValidation = [
  body('name')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('宠物名字长度必须在1-100个字符之间')
    .trim(),
  
  body('species')
    .optional()
    .isIn(['dog', 'cat', 'bird', 'fish', 'rabbit', 'hamster', 'guinea_pig', 'reptile', 'other'])
    .withMessage('请选择有效的宠物种类'),
  
  body('breed')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('品种名称长度必须在1-100个字符之间')
    .trim(),
  
  body('gender')
    .optional()
    .isIn(['male', 'female', 'unknown'])
    .withMessage('性别必须是 male、female 或 unknown'),
  
  body('dateOfBirth')
    .optional()
    .isISO8601()
    .withMessage('请提供有效的出生日期'),
  
  body('color')
    .optional()
    .isLength({ min: 1, max: 100 })
    .withMessage('颜色描述长度必须在1-100个字符之间')
    .trim(),
  
  body('size')
    .optional()
    .isIn(['small', 'medium', 'large', 'extra_large'])
    .withMessage('大小必须是 small、medium、large 或 extra_large'),
  
  body('weight')
    .optional()
    .isFloat({ min: 0.1, max: 200 })
    .withMessage('体重必须在0.1-200kg之间'),
  
  body('status')
    .optional()
    .isIn(['active', 'inactive', 'lost', 'deceased'])
    .withMessage('状态必须是 active、inactive、lost 或 deceased')
];

const updateHealthValidation = [
  body('vaccinations')
    .optional()
    .isArray()
    .withMessage('疫苗信息必须是数组'),
  
  body('spayedNeutered')
    .optional()
    .isBoolean()
    .withMessage('绝育状态必须是布尔值'),
  
  body('allergies')
    .optional()
    .isArray()
    .withMessage('过敏信息必须是数组'),
  
  body('medications')
    .optional()
    .isArray()
    .withMessage('药物信息必须是数组'),
  
  body('medicalConditions')
    .optional()
    .isArray()
    .withMessage('医疗状况必须是数组')
];

// 应用限流中间件
router.use(petLimiter);

// 公开路由（可选认证）
/**
 * @route   GET /api/pets/search
 * @desc    搜索宠物
 * @access  Public
 */
router.get('/search', optionalAuth, petController.searchPets);

/**
 * @route   GET /api/pets/:id
 * @desc    获取宠物详情
 * @access  Public
 */
router.get('/:id', optionalAuth, petController.getPet);

// 需要认证的路由
router.use(protect);

// 用户自己的宠物操作

/**
 * @route   GET /api/pets/my-pets
 * @desc    获取当前用户的所有宠物
 * @access  Private
 */
router.get('/my-pets', petController.getMyPets);

/**
 * @route   POST /api/pets
 * @desc    创建新宠物
 * @access  Private
 */
router.post('/', createPetValidation, petController.createPet);

// 管理员路由
/**
 * @route   GET /api/pets/stats
 * @desc    获取宠物统计信息
 * @access  Private/Admin
 */
router.get('/stats', restrictTo('admin'), petController.getPetStats);

/**
 * @route   GET /api/pets
 * @desc    获取所有宠物（管理员）
 * @access  Private/Admin
 */
router.get('/', restrictTo('admin'), petController.getAllPets);

/**
 * @route   PATCH /api/pets/:id
 * @desc    更新宠物信息
 * @access  Private (Owner/Admin)
 */
router.patch('/:id', updatePetValidation, petController.updatePet);

/**
 * @route   DELETE /api/pets/:id
 * @desc    删除宠物
 * @access  Private (Owner/Admin)
 */
router.delete('/:id', petController.deletePet);

/**
 * @route   PATCH /api/pets/:id/health
 * @desc    更新宠物健康信息
 * @access  Private (Owner/Admin)
 */
router.patch('/:id/health', updateHealthValidation, petController.updatePetHealth);

/**
 * @route   POST /api/pets/:id/photos
 * @desc    上传宠物照片
 * @access  Private (Owner/Admin)
 */
// TODO: 添加文件上传中间件
// router.post('/:id/photos', upload.array('photos', 5), petController.uploadPetPhotos);

/**
 * @route   DELETE /api/pets/:id/photos
 * @desc    删除宠物照片
 * @access  Private (Owner/Admin)
 */
router.delete('/:id/photos', petController.deletePetPhoto);

module.exports = router;